﻿using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using STeaL.Algorithm;
using STeaL.Functional;

namespace Test {

  [TestClass]
  public class IListTest_3 {

    private TestContext testContextInstance;

    /// <summary>
    ///現在のテストの実行についての情報および機能を
    ///提供するテスト コンテキストを取得または設定します。
    ///</summary>
    public TestContext TestContext {
      get { return testContextInstance; }
      set { testContextInstance = value; }
    }

    #region 追加のテスト属性
    // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
    [ClassInitialize()]
    public static void ClassInitialize(TestContext testContext) { }

    // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
    [ClassCleanup()]
    public static void ClassCleanup() { }

    // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
    [TestInitialize()]
    public void TestInitialize() { c = new List<int>(); }

    // 各テストを実行した後に、TestCleanup を使用してコードを実行してください
    [TestCleanup()]
    public void TestCleanup() { }
    #endregion

    [TestMethod]
    public void sort_1() {
      c.assign(new int[] { 9,2,4,6,8,1,3,5,7,0 });
      c.sort(1,9);
      Assert.AreEqual(9, c[0]);
      Assert.AreEqual(0, c[9]);
      Assert.IsTrue(c.is_sorted(1,9));
    }

    [TestMethod]
    public void sort_2() {
      c.assign(new int[] { 9,2,4,6,8,1,3,5,7,0 });
      c.sort(1,9,rel_op.greater<int>);
      Assert.AreEqual(9, c[0]);
      Assert.AreEqual(0, c[9]);
      Assert.IsTrue(c.is_sorted(1,9,rel_op.greater<int>));
    }

    [TestMethod]
    public void is_sorted_until() {
      c.assign(new int[] { 1, 2, 3, 4, 5 ,6 ,7, 8, 9, 0 });
      Assert.AreEqual(9, c.is_sorted_until(0,9));
    }

    [TestMethod]
    public void min_element() {
      c.assign(new int[] { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 });
      Assert.AreEqual(5, c.min_element());
      Assert.AreEqual(5, c.min_element(2,8));
    }

    [TestMethod]
    public void max_element() {
      c.assign(new int[] { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 });
      Assert.AreEqual(4, c.max_element());
      Assert.AreEqual(4, c.max_element(2,8));
    }

    [TestMethod]
    public void minmax_element() {
      c.assign(new int[] { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 });
      Assert.AreEqual(5, c.minmax_element().Item1);
      Assert.AreEqual(5, c.minmax_element(2,8).Item1);
      Assert.AreEqual(4, c.minmax_element().Item2);
      Assert.AreEqual(4, c.minmax_element(2,8).Item2);
    }

    private IList<int> c;
  }
}
